package org.fixies.spreadsheet.excel.poi;

import org.apache.poi.hssf.usermodel.HSSFCell;

/**
 * HSSFのセル値を文字列に変換するコンバータ抽象クラス
 *
 * @author Kawasaki
 */
public abstract class AbstractHSSFCellValueConverter implements HSSFCellValueConverter {

    /**
     * デフォルトコンストラクタ
     */
    public AbstractHSSFCellValueConverter() {
        super();
    }


    /**
     * @see org.fixies.spreadsheet.excel.poi.HSSFCellValueConverter#convert(org.apache.poi.hssf.usermodel.HSSFCell)
     */
    public String convert(HSSFCell cell) {

        String data;
        if (cell == null) {
            return "";
        }
        int cellType = cell.getCellType();

        switch (cellType) {
            // セルの値が文字型の場合
            case HSSFCell.CELL_TYPE_STRING:
                data = inCaseCellTypeString(cell);
                break;
            // セルの値が数値型の場合
            case HSSFCell.CELL_TYPE_NUMERIC:
                data = inCaseCellTypeNumeric(cell);
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                data = inCaseCellTypeBoolean(cell);
                break;

            // セルの値が空の場合
            case HSSFCell.CELL_TYPE_BLANK:
                data = inCaseCellTypeBlank(cell);
                break;
            // その他の場合
            default:
                data = inCaseDefault(cell);
                break;
        }
        return data;
    }


    /**
     * 文字列型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeString(HSSFCell cell);

    /**
     * 数値型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeNumeric(HSSFCell cell);

    /**
     * ブーリアン型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeBoolean(HSSFCell cell);

    /**
     * ブランクの場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeBlank(HSSFCell cell);

    /**
     * エラー型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeError(HSSFCell cell);


    /**
     * 式型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseCellTypeFormula(HSSFCell cell);

    /**
     * その他の型の場合の処理
     *
     * @param cell セル
     * @return 変換結果
     */
    abstract String inCaseDefault(HSSFCell cell);

}
